約 6,321,827 件
https://w.atwiki.jp/tomokazu0525/pages/273.html
最終更新日時2012-01-25 ■目次 win32apiRUBY 未分類 ページフッタこのページの1階層上のページ このページの1階層下のページ このページに含まれるタグ このページへのアクセス数 ■本文 win32api Win32API(C言語)編 トップページ RUBY たんたは「RubyでWin32APIプログラミングに触れてみた(1)」 未分類 ウェブエンジニアがWindowsアプリケーション開発するとしたらど.. - 人力検索はてな Windowsソフト開発研究室 ゲームプログラミング入門の入門 | いちばんやさしいゲームの作り方 ページフッタ このページの1階層上のページ このページの1階層下のページ このページに含まれるタグ このページへのアクセス数 今日: - 昨日: - これまで合計: -
https://w.atwiki.jp/noobmaster/pages/45.html
ファイル操作CreateFile ReadFile WriteFile DeleteFile MapViewOfFile ファイル実行WinExec CreateProcess system ShellExecute メモリ管理GetProcessHeap HeapAlloc HeapCreate HeapReAlloc HeapSize HeapFree HeapSetInformation ReadProcessMemory WriteProcessMemory スレッドGetCurrentThread GetCurrentThreadId SuspendThread ResumeThread GetThreadContext SetThreadContext CreateRemoteThread ディレクトリGetTempPath GetModuleFilename レジストリRegOpenKey ネットワークWSAStartup send recv bind accept コードページGetACP GetOEMCP GetCPInfo GetConsoleCP デバッガ検出IsDebuggerPresent CheckRemoteDebuggerPresent 未分類GetModuleHandle GetProcAddress LoadLibrary CreateMutex CreateService GetStartupInfo EnumProcess EnumProcessModules GetVersionEx SetWindowsHookEx VirtualAllocEx VirtualProtectEx gethostbyname gethostname GetCurrentProcess GetCurrentProcessId CreateToolhelp32Snapshot CallNextHookEx ファイル操作 CreateFile 新しいファイルの作成または既存のファイルを開いてそのハンドルを返す. HANDLE CreateFile( LPCTSTR lpFileName,// ファイル名 DWORD dwDesiredAccess,// アクセスモード DWORD dwShareMode,// 共有モード LPSECURITY_ATTRIBUTES lpSecurityAttributes,// セキュリティ記述子 DWORD dwCreationDisposition,// 作成方法 DWORD dwFlagsAndAttributes,// ファイル属性 HANDLE hTemplateFile// テンプレートファイルのハンドル ); ReadFile ファイルからデータを読み取る. BOOL ReadFile( HANDLE hFile,// ファイルのハンドル LPVOID lpBuffer,// データバッファ DWORD nNumberOfBytesToRead,// 読み取り対象のバイト数 LPDWORD lpNumberOfBytesRead,// 読み取ったバイト数 LPOVERLAPPED lpOverlapped// オーバーラップ構造体のバッファ ); WriteFile ファイルにデータを書き込む. BOOL WriteFile( HANDLE hFile,// ファイルのハンドル LPCVOID lpBuffer,// データバッファ DWORD nNumberOfBytesToWrite,// 書き込み対象のバイト数 LPDWORD lpNumberOfBytesWritten,// 書き込んだバイト数 LPOVERLAPPED lpOverlapped// オーバーラップ構造体のバッファ ); DeleteFile 既存のファイルを削除する. BOOL DeleteFile( LPCTSTR lpFileName // ファイル名 ); MapViewOfFile 呼び出し側プロセスのアドレス空間にファイルのビューをマップする. ランチャーやローダー,インジェクターはPEファイルを読み込んで改変するためにこの関数を利用する. マルウェアはファイルのコンテンツを改変する際にWriteFileの代わりにこの関数を利用することがある. LPVOID MapViewOfFile( HANDLE hFileMappingObject, // ファイルマッピングオブジェクトのハンドル DWORD dwDesiredAccess, // アクセスモード DWORD dwFileOffsetHigh, // オフセットの上位 DWORD DWORD dwFileOffsetLow, // オフセットの下位 DWORD SIZE_T dwNumberOfBytesToMap // マップ対象のバイト数 ); ファイル実行 WinExec 指定されたアプリケーションを実行する. 例 ダミーの文書ファイルの表示,ドロップされたファイルの実行 UINT WinExec( LPCSTR lpCmdLine,// コマンドラインへのポインタ UINT uCmdShow// ウィンドウの表示状態 ); CreateProcess 新しいプロセスを作成して実行する. BOOL CreateProcess( LPCTSTR lpApplicationName,// 実行可能モジュールの名前 LPTSTR lpCommandLine,// コマンドラインの文字列 LPSECURITY_ATTRIBUTES lpProcessAttributes,// セキュリティ記述子 LPSECURITY_ATTRIBUTES lpThreadAttributes,// セキュリティ記述子 BOOL bInheritHandles,// ハンドルの継承オプション DWORD dwCreationFlags,// 作成のフラグ LPVOID lpEnvironment,// 新しい環境ブロック LPCTSTR lpCurrentDirectory,// カレントディレクトリの名前 LPSTARTUPINFO lpStartupInfo,// スタートアップ情報 LPPROCESS_INFORMATION lpProcessInformation// プロセス情報 ); system Cランタイムライブラリによって提供されるプログラムを起動する. Windows上では,この関数はCreateProcess関数のラッパー関数として機能している. int system( const char *command ); ShellExecute 指定されたファイルに対して,指定された操作を実行する. HINSTANCE ShellExecute( HWND hwnd,// 親ウィンドウのハンドル LPCTSTR lpVerb,// 操作 LPCTSTR lpFile,// 操作対象のファイル LPCTSTR lpParameters,// 操作のパラメータ LPCTSTR lpDirectory,// 既定のディレクトリ INT nShowCmd// 表示状態 ); メモリ管理 GetProcessHeap 呼び出し側プロセスのヒープのハンドルを取得する. その後,HeapAlloc,HeapReAlloc,HeapFree,HeapSize の各関数でこのハンドルを使用できる. HANDLE GetProcessHeap(VOID); HeapAlloc メモリブロックをヒープから割り当てる. LPVOID HeapAlloc( HANDLE hHeap, // プライベートヒープブロックのハンドル DWORD dwFlags, // ヒープの割り当て方法の制御 SIZE_T dwBytes // 割り当てたいバイト数 ); HeapCreate 呼び出し側プロセスが使用できるヒープオブジェクトを作成する. この関数はプロセスの仮想アドレス空間内の領域を予約し,このブロック内の指定された初期のパートに物理格納域を割り当てる. HANDLE HeapCreate( DWORD flOptions, // ヒープ割り当て方法の属性 SIZE_T dwInitialSize, // 初期のヒープサイズ SIZE_T dwMaximumSize // 最大ヒープサイズ ); HeapReAlloc ヒープからメモリブロックを再割り当てする. この結果,メモリブロックのサイズや他のプロパティを変更できる. LPVOID HeapReAlloc( HANDLE hHeap, // ヒープブロックのハンドル DWORD dwFlags, // ヒープ再割り当てのオプション LPVOID lpMem, // 再割り当てしたいメモリへのポインタ SIZE_T dwBytes // 再割り当てしたいバイト数 ); HeapSize HeapAlloc 関数または HeapReAlloc 関数を使ってヒープから割り当てたメモリブロックのサイズをバイト単位で取得する. DWORD HeapSize( HANDLE hHeap, // ヒープのハンドル DWORD dwFlags, // ヒープサイズに関するオプション LPCVOID lpMem // メモリへのポインタ ); HeapFree HeapAlloc 関数または HeapReAlloc 関数がヒープから割り当てたメモリブロックを解放する. BOOL HeapFree( HANDLE hHeap, // ヒープのハンドル DWORD dwFlags, // ヒープ解放オプション LPVOID lpMem // メモリへのポインタ ); HeapSetInformation 指定されたヒープの機能を有効にする. BOOL WINAPI HeapSetInformation( HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, SIZE_T HeapInformationLength ); ReadProcessMemory 指定されたプロセスのメモリ領域からデータを読み取る. ただし,読み取られる領域全体がアクセス可能でなければならない. BOOL ReadProcessMemory( HANDLE hProcess, // プロセスのハンドル LPCVOID lpBaseAddress, // 読み取り開始アドレス LPVOID lpBuffer, // データを格納するバッファ DWORD nSize, // 読み取りたいバイト数 LPDWORD lpNumberOfBytesRead // 読み取ったバイト数 ); WriteProcessMemory 指定されたプロセスのメモリ領域にデータを書き込む. 書き込みたい領域全体がアクセス可能でなければならない. BOOL WriteProcessMemory( HANDLE hProcess, // プロセスのハンドル LPVOID lpBaseAddress, // 書き込み開始アドレス LPVOID lpBuffer, // データバッファ DWORD nSize, // 書き込みたいバイト数 LPDWORD lpNumberOfBytesWritten // 実際に書き込まれたバイト数 ); スレッド GetCurrentThread 現在のスレッドの擬似ハンドルを取得する. HANDLE GetCurrentThread(VOID); GetCurrentThreadId 呼び出し側スレッドのスレッド識別子を取得する. DWORD GetCurrentThreadId(VOID); SuspendThread 指定されたスレッドの実行を中断する. DWORD SuspendThread( HANDLE hThread // スレッドのハンドル ); ResumeThread スレッドのサスペンド(中断)カウントを 1 減らす. サスペンドカウントが 0 になるとスレッドの実行が再開される. DWORD ResumeThread( HANDLE hThread // スレッドのハンドル ); GetThreadContext 指定したスレッドのコンテキストを取得する. スレッドのコンテキストは,レジスタ値や現在の状態などスレッドの全ての情報を格納している. BOOL GetThreadContext( HANDLE hThread, // コンテキストを持つスレッドのハンドル LPCONTEXT lpContext // コンテキストを受け取る構造体のアドレス ); SetThreadContext 指定したスレッドのコンテキストを設定する. いくつかのインジェクション技術でこの関数を利用される. BOOL SetThreadContext( HANDLE hThread, // このテキストを持つスレッドのハンドル CONST CONTEXT *lpContext // コンテキストが入った構造体のアドレス ); CreateRemoteThread 別のプロセスのアドレス空間で稼働するスレッドを作成する. ランチャーやステルスマルウェアが他のプロセスに対してコードインジェクションする際にこの関数を利用することがある. HANDLE CreateRemoteThread( HANDLE hProcess,// 新しいスレッドを稼働させるプロセスを識別するハンドル LPSECURITY_ATTRIBUTES lpThreadAttributes, // スレッドのセキュリティ属性へのポインタ DWORD dwStackSize,// 初期のスタックサイズ (バイト数) LPTHREAD_START_ROUTINE lpStartAddress, // スレッド関数へのポインタ LPVOID lpParameter,// 新しいスレッドの引数へのポインタ DWORD dwCreationFlags,// 作成フラグ LPDWORD lpThreadId// 取得したスレッド識別子へのポインタ ); ディレクトリ GetTempPath 一時ファイル用のディレクトリのパスを取得する. マルウェアがこの関数を呼び出している場合,一時ファイルパスにファイルの読み書きをしているかどうかを確認する. DWORD GetTempPath( DWORD nBufferLength,// バッファのサイズ LPTSTR lpBuffer// パスを格納するバッファ ); GetModuleFilename 指定されたモジュールを含む実行ファイルの,フルパス名とファイル名を取得する. マルウェアは現在の実行プロセス内でファイルをコピーまたは改変するためにこの関数を使用する. DWORD GetModuleFileName( HMODULE hModule,// モジュールのハンドル LPTSTR lpFilename,// モジュールのファイル名 DWORD nSize// バッファのサイズ ); レジストリ RegOpenKey 指定されたレジストリキーを開く. LONG RegOpenKey( HKEY hKey, // 開いている親キーのハンドル LPCTSTR lpSubKey, // 開くべきサブキーの名前 PHKEY phkResult // 開くことに成功したサブキーのハンドル ); ネットワーク WSAStartup ローレベルのネットワーク機能(Winsock DLL)の初期化を行う. このAPIを探索するのが,ネットワークに関連する機能が開始する位置を特定するための簡単な手法である. int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); send リモートマシンにデータを送信する. マルウェアはC Cサーバにデータを送信する際にこの関数をよく利用している. int send( SOCKET s, const char *buf, int len, int flags ); recv リモートマシンからデータを受信する. マルウェアはC Cサーバからデータを受信する際にこの関数をよく利用している. int recv( SOCKET s, char *buf, int len, int flags ); bind ローカルアドレスとソケットを関連付ける. int bind( SOCKET s, const struct sockaddr *name, int namelen ); accept 外部からの接続試行を許可する. SOCKET accept( SOCKET s, struct sockaddr *addr, int *addrlen ); コードページ GetACP システムで現在有効になっている ANSI コードページの識別子を取得する. UINT GetACP(VOID); GetOEMCP システムで現在有効になっている OEM コードページの識別子を取得する. UINT GetOEMCP(void); GetCPInfo インストール済みの有効なコードページまたは利用可能なコードページに関する情報を取得する. BOOL GetCPInfo( UINT CodePage, // コードページの識別子 LPCPINFO lpCPInfo // 情報が格納されるバッファ ); GetConsoleCP 呼び出し側プロセスのコンソールが使う入力コードページを返す. コンソールはその入力コードページを使ってキーボード入力を対応する文字値に変換する. UINT GetConsoleCP(VOID); デバッガ検出 IsDebuggerPresent 呼び出し側プロセスがデバッガのコンテキストで実行されているかどうかを調べる. BOOL IsDebuggerPresent(VOID); CheckRemoteDebuggerPresent 特定のプロセスがデバッグされているかどうかをチェックする. この関数はマルウェアのアンチデバッグ技術の一部として時折使用される. BOOL WINAPI CheckRemoteDebuggerPresent( HANDLE hProcess, PBOOL pbDebuggerPresent ); 未分類 GetModuleHandle ロードされているモジュールのハンドルを取得する. マルウェアは当該モジュール位置の取得,コード改変,コードインジェクションのポイントを検索するためにこの関数を使用する. HMODULE GetModuleHandle( LPCTSTR lpModuleName // モジュール名 ); GetProcAddress ダイナミックリンクライブラリ(DLL)が持つ,指定されたエクスポート済み関数のアドレスを取得する. PEファイルヘッダにインポートされた関数に加えて,他のDLLから関数をインポートするのに使用される. FARPROC GetProcAddress( HMODULE hModule,// DLL モジュールのハンドル LPCSTR lpProcName// 関数名 ); LoadLibrary 指定された実行可能モジュールを,呼び出し側プロセスのアドレス空間内にマップする. ほぼ全てのWin32プログラムによってインポートされている関数である. HMODULE LoadLibrary( LPCTSTR lpFileName // モジュールのファイル名 ); CreateMutex 名前付きまたは名前なしのミューテックス(mutually exclusive;相互排他)オブジェクトを作成または開く. HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,// セキュリティ記述子 BOOL bInitialOwner,// 最初の所有者 LPCTSTR lpName// オブジェクトの名前 ); CreateService サービスオブジェクトを作成し,サービス制御マネージャ(Service Control Manager:SCM)の指定されたデータベースに追加する. SC_HANDLE CreateService( SC_HANDLE hSCManager, // SCM データベースのハンドル LPCTSTR lpServiceName, // 開始したいサービスの名前 LPCTSTR lpDisplayName, // 表示名 DWORD dwDesiredAccess, // サービスのアクセス権のタイプ DWORD dwServiceType, // サービスのタイプ DWORD dwStartType, // サービスを開始する時期 DWORD dwErrorControl, // サービスに失敗したときの深刻さ LPCTSTR lpBinaryPathName, // バイナリファイル名 LPCTSTR lpLoadOrderGroup, // ロード順序を決定するグループ名 LPDWORD lpdwTagId, // タグ識別子 LPCTSTR lpDependencies, // 複数の依存名からなる配列 LPCTSTR lpServiceStartName, // アカウント名 LPCTSTR lpPassword // アカウントのパスワード ); GetStartupInfo 呼び出し側プロセスを作成する際に指定された構造体の内容を取得する. VOID GetStartupInfo( LPSTARTUPINFO lpStartupInfo // スタートアップ情報 ); EnumProcess システム内の各プロセスオブジェクト用のプロセス識別子を取得する. BOOL EnumProcesses( DWORD * lpidProcess, // プロセス識別子を受け取る配列 DWORD cb, // 配列のサイズ DWORD * cbNeeded // 返されたバイト数 ); EnumProcessModules 指定されたプロセス内の各モジュールのハンドルを取得する. BOOL EnumProcessModules( HANDLE hProcess, // プロセスのハンドル HMODULE * lphModule, // モジュールハンドルを受け取る配列 DWORD cb, // 配列のサイズ LPDWORD lpcbNeeded // 必要なバイト数 ); GetVersionEx 現在動作しているオペレーティングシステムのバージョンに関する拡張情報を取得する. 動作環境の調査やバージョンの異なるWindows間で変更されている文書化されていない構造体にアクセスするためのオフセット選択のために利用される. BOOL GetVersionEx( LPOSVERSIONINFO lpVersionInfo // バージョン情報 ); SetWindowsHookEx アプリケーション定義のフックプロシージャをフックチェーン内にインストールする. HHOOK SetWindowsHookEx( int idHook, // フックタイプ HOOKPROC lpfn, // フックプロシージャ HINSTANCE hMod, // アプリケーションインスタンスのハンドル DWORD dwThreadId // スレッドの識別子 ); VirtualAllocEx 指定されたプロセスの仮想アドレス空間内のメモリ領域の予約とコミットの一方または両方を行う. LPVOID VirtualAllocEx( HANDLE hProcess, // 割り当てたいメモリを保持するプロセス LPVOID lpAddress, // 割り当てたい開始アドレス DWORD dwSize, // 割り当てたい領域のバイト単位のサイズ DWORD flAllocationType, // 割り当てのタイプ DWORD flProtect // アクセス保護のタイプ ); VirtualProtectEx 指定されたプロセスの仮想アドレス空間内のコミット済みページ領域に対するアクセス保護の状態を変更する. BOOL VirtualProtectEx( HANDLE hProcess, // プロセスのハンドル LPVOID lpAddress, // コミット済みページ領域のアドレス DWORD dwSize, // 領域のサイズ DWORD flNewProtect, // 希望のアクセス保護 PDWORD lpflOldProtect // 従来のアクセス保護を取得する変数のアドレス ); gethostbyname ホストデータベースからホスト名に対応するホスト情報を取得する. リモートホストに対してIPコネクションを確率する前に特定のホスト名でDNSルックアップを実行するのに使用される. C Cサーバとして機能するホスト名はネットワークベースのシグネチャを作成するのに利用できる. struct hostent* FAR gethostbyname( const char *name ); gethostname ローカルコンピュータの標準ホスト名を取得する. バックドアはターゲットマシンの調査にこの関数を利用することがある. int gethostname( char *name, int namelen ); GetCurrentProcess 現在のプロセスに対応する疑似ハンドルを取得する. HANDLE GetCurrentProcess(VOID); GetCurrentProcessId 呼び出し側プロセスのプロセス識別子を取得する. DWORD GetCurrentProcessId(VOID); CreateToolhelp32Snapshot プロセスとプロセスが使っているヒープ,モジュール,スレッドのスナップショットを作成する. マルウェアはしばしばプロセスまたはスレッドに対して反復処理するコードでこの関数を利用する. HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID ); CallNextHookEx 現在のフックチェーン内の次のフックプロシージャにフック情報を渡す. SetWindowsHookEx関数によってセットされるイベントをフックするコードで使用される. SetWindowsHookExによってセットされるフックの目的を特定するためにはこの関数の分析を行うとよい. LRESULT CallNextHookEx( HHOOK hhk, // 現在のフックのハンドル int nCode, // フックプロシージャに渡すフックコード WPARAM wParam, // フックプロシージャに渡す値 LPARAM lParam // フックプロシージャに渡す値 );
https://w.atwiki.jp/jennychan/pages/17.html
大抵の場合は、Win32 APIを使用しなくても済んでしまうのですが、たまに必要なときがあります。 ファイルIO .NET FrameworkのSystem.IOクラスでは、「\\.\physicaldrive0」などの物理ドライブに対するアクセスが出来ないので、CreateFile APIを使用する事になります。 参考資料は、Windows の ReadFile 関数を使用するで、ポイントは、 DllImportでDLLとAPIを指定する プロジェクトのビルドプロパティで、「アンセーフコードの許可」をチェック となります。 ただし、MSのサンプルでは、CreateFileメソッドの返却値が0以外のときは成功としているのですが、無効なドライブを指定した時は、0xffffffffが返され、正常終了扱いとなってしまいます。 なお、「\\.\c 」の様な、論理ドライブに対する処理は、System.IO.DriveInfoクラスを使用すれば可能です。 System.IO.DriveInfo = new System.IO.DriveInfo("c"); Console.WriteLine(string.Format("{0} {1} {2}Byte(s)", info.ToString(), info.DriveFormat, info.TotalSize)); 全てのドライブを取得するには、staticメソッドのGetDrivesを使用します。 foreach (System.IO.DriveInfo info in System.IO.DriveInfo.GetDrives()) { Console.WriteLine(string.Format("{0} {1} {2}Byte(s)", info.ToString(), info.DriveFormat, info.TotalSize)); } MSのWindows の ReadFile 関数を使用するの、CreateFileのエラー判定処理を修正すると共に、ドライブの容量を取得するDeviceIoControl処理を追加した、C#のコンソールアプリケーションベースのコードをメモとして載せておきます。 なお、DeviceIoControl処理の詳細は、Microsoft Platform SDKのWinIoCtl.hを見るのが一番かもしれません。 class FileReader { const uint GENERIC_READ = 0x80000000; const uint FILE_SHARE_WRITE = 0x00000002; // 物理ディスクを指定する場合、OPEN_EXISTINGを指定しなければいけないらしい const uint OPEN_EXISTING = 3; System.IntPtr handle; [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)] static extern unsafe System.IntPtr CreateFile ( string FileName, // file name uint DesiredAccess, // access mode uint ShareMode, // share mode uint SecurityAttributes, // Security Attributes uint CreationDisposition, // how to create uint FlagsAndAttributes, // file attributes int hTemplateFile // handle to template file ); [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)] static extern unsafe bool ReadFile ( System.IntPtr hFile, // handle to file void* pBuffer, // data buffer int NumberOfBytesToRead, // number of bytes to read int* pNumberOfBytesRead, // number of bytes read int Overlapped // overlapped buffer ); [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)] static extern unsafe bool CloseHandle ( System.IntPtr hObject // handle to object ); // ドライブの容量を取得するためにDeviceIoControlを使用する const uint IOCTL_DISK_GET_LENGTH_INFO = 0x7405c; [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)] static extern unsafe bool DeviceIoControl( System.IntPtr hFile, // handle to file uint dwIoControlCode, // 実行する動作の制御コード void* lpInBuffer, // 入力データを供給するバッファへのポインタ uint nInBufferSize, // 入力バッファのバイト単位のサイズ void* lpOutBuffer, // 出力データを受け取るバッファへのポインタ uint nOutBufferSize, // 出力バッファのバイト単位のサイズ uint* lpBytesReturned, // バイト数を受け取る変数へのポインタ int Overlapped // overlapped buffer ); public bool Open(string FileName) { // open the existing file for reading handle = CreateFile ( FileName, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 ); // 物理ドライブ処理のエラーは、0xffffffffとなる if (handle != System.IntPtr.Zero (uint)handle.ToInt32() != (uint)0xffffffff) { return true; } else { return false; } } public unsafe int Read(byte[] buffer, int index, int count) { int n = 0; fixed (byte* p = buffer) { if (!ReadFile(handle, p + index, count, n, 0)) { return 0; } } return n; } public bool Close() { return CloseHandle(handle); } // ディスクの容量を取得する public unsafe long GetDiskSize() { long lDiskSize = 0; uint nBytes = sizeof(long); bool bResult = DeviceIoControl(handle, IOCTL_DISK_GET_LENGTH_INFO, null, 0, lDiskSize, nBytes, nBytes, 0); return lDiskSize; } } class Program { static void Main(string[] args) { FileReader fr = new FileReader(); for (int i = 0; i = 9; i++) { string sDrivePath = string.Format(@"\\.\physicaldrive{0}", i); if (fr.Open(sDrivePath)) { long lDiskSize = fr.GetDiskSize(); fr.Close(); double dSize = lDiskSize / 1000000; if (dSize 1000) { dSize /= 1000; System.Console.WriteLine( string.Format("Drive{0} {1,7 F1}GB", i, dSize)); } else System.Console.WriteLine( string.Format("Drive{0} {1,7 F1}MB", i, dSize)); } } return; } } レジストリ .NET Frameworkでは、Microsoft.Win32.Registryからルートレジストリをアクセスできます。 たとえば、ADO.NET 2.0では、Microsoft Data Access Components(MDAC)2.8以降のバージョンが必要とされています。 MDACのバージョンは、レジストリのHKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess\FullInstallVerを取得する事で確認できます。 そこで、MDACのバージョンを確認するメソッドは、 private bool ChkMDAC() { string sFullVer = (string)Microsoft.Win32.Registry.GetValue (@"HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess", "FullInstallVer", ""); bool bResult = false; if (!string.IsNullOrEmpty(sFullVer)) { string[] sVer = sFullVer.Split( . ); int iVer1 = Convert.ToInt16(sVer[0]); int iVer2 = Convert.ToInt16(sVer[1]); if (iVer1 2 || (iVer1 == 2 iVer2 80)) bResult = false; else bResult = true; } return bResult; } の様になります。 ※ マイクロソフトのサポート情報では、レジストリ上のバージョン情報はあてにならない場合があるので、Component Checkerというツールを使って確認する事を推奨していますが、不特定多数のユーザ向けのソフトウェアの場合、Component Checkerツールのインストールも要求するような事は非現実的だと思います。 また、レジストリのバージョン情報を参照するときも、FullInstallVer値と、Version値の両方の値を確認するように推奨していますが、手元のマシンの場合、 FullInstallVer "2.81.1117.0" Version "2.0.0" となっています
https://w.atwiki.jp/m_shige1979/pages/595.html
MinGW 初期設定 文法 ライブラリ サンプル 参考 猫でも分かるプログラミング MinGWについて Win32API(C言語)編 Windows API
https://w.atwiki.jp/rai002/pages/50.html
WINAPI ドラッグアンドドロップ ヘッダー shellapi.h windows.hをインクルード時は多分要らない メッセージ WM_DROPFILES 初期 VOID DragAcceptFiles( HWND hWnd, //ウィンドウのハンドル BOOL fAccept //受け入れの有無 ); hWnd ドラッグアンドドロップを受け入れるかどうか設定するべきウィンドウのハンドルを指定します。 fAccept hWnd パラメータで指定されたウィンドウが、ドロップされたファイルを受け入れるかどうかを 指定します。TRUE を指定すると、ファイルを受け入れます。FALSE を指定すると、ファイルを受け入れません。 基本的に利用 UINT DragQueryFile( HDROP hDrop, //ファイル名構造体のハンドル UINT iFile, //ファイルのインデックス番号 LPTSTR lpszFile, //ファイル名を格納するバッファ UINT cch //バッファのサイズ ); hDrop ドロップされた複数のファイルの名前を保持している、1 個の内部構造体のハンドルを指定します。 iFile 問い合わせ対象のファイルのインデックス番号を指定します。 0xFFFFFFFF(言い換えると -1)を指定すると、DragQueryFile は、ドロップされたファイルの総数を返します。 0~ドロップされたファイルの総数未満のいずれかの値を指定すると、 DragQueryFile は、lpszFile パラメータが指すバッファに、その値に対応するファイルの名前を格納します。 lpszFile 1 個のバッファへのポインタを指定します。関数から制御が返ると、このバッファに、 ドロップされた特定のファイルの名前が格納されます。NULL を指定すると、 DragQueryFile は必要なバッファのサイズを文字単位で返します。 cch lpszFile が指すバッファのサイズを文字単位で指定します。 戻り値 関数がバッファにファイル名を格納すると、格納した文字数が返ります。 終端の NULL 文字は、文字数に含まれません。 iFile パラメータで 0xFFFFFFFF(-1)を指定した場合、 ドラッグアンドドロップされたファイルの総数が返ります。 iFile パラメータで、0~ドロップされたファイルの総数未満の値を指定し、 さらに lpszFile パラメータで NULL を指定した場合、ファイル名を格納するために必要な バッファのサイズが文字単位で返ります。終端の NULL 文字は、文字数に含まれません。 ドロップファイルと位置 BOOL DragQueryPoint( HDROP hDrop, //ファイル名構造体のハンドル LPPOINT lppt //マウスカーソルの位置 ); hDrop ドロップされたファイルを表す内部データ構造体を操作するためのハンドルを指定します。 この値は WM_DROPFILES メッセージの wParam パラメータにあたります。 ppt ドロップされたときのマウスポインタの位置を格納するための POINT 構造体のアドレスを指定します。 開放の宣言 VOID DragFinish( HDROP hDrop //ファイル名構造体のハンドル ); hDrop ドロップされたファイルについて記述している内部構造体のハンドルを指定します。 このハンドルは、WM_DROPFILESメッセージの wParam パラメータから取得できます 参考URL: 独学プログラミング言語のページ Win32API(C言語,C++) DragAcceptFiles http //www.monmon-dance.com/win32api/dragacceptfiles.html MSDN
https://w.atwiki.jp/rtdb/pages/29.html
概要 プログラムがある処理を実行している途中でなんらかの異常が発生した場合に現在の処理を中断して別の処理を行うこと。その際に発生した異常のことを例外と呼ぶ。 何を持って「異常」とするかは様々であるが、次のようなものが挙げられる。 ハードウェアの故障 オペレーティングシステム等、システムの設定ミス ライブラリの欠損 割り当てられていない記憶領域へのアクセス 許されない演算(零での除算や実数演算で解が虚数になる演算など) 上位ほど重大で正常復帰させるのは難しい。3以上はDBの実装しだいで回避できるはず。 アンセーフコードで使うアンマネージドメモリはVirtualAllocで確保するため、確保できなかったときのエラー処理はわかりやすい。 問題はマネージドメモリの例外だ。これが発生する可能性はあらゆるところである。例えば 作業用のコレクションクラス DynamicMethod StringBuilder ... どれも便利で必須だがコード内のあらゆる場所に出現する。 これらのエラーが発生すべき場所を特定し、然るべき処理法を確立しなければならない。 foreachを使わずforを使う foreachはIEnumeratorを継承したクラス(参照)型オブジェクトを使う。 マネージドヒープから確保するためOutOfMemoryExceptionを発生させる可能性がある。 forでループカウンタを使ったほうがよいかと。 セーフコードをアンセーフコードに置き換え デバッグコード以外、全てアンセーフコードを駆使してOutOfMemoryの可能性を消す。 アンマネージドメモリ確保失敗する位置を限定させ、適切な復帰処理を入れる。 デバッグコードはセーフコードを使うことが多い。 これも可能であれば例外を発生させたくない。回避策としてエラーの対処が難しい、複雑、遅いと思われるところは前もって必要なメモリ量、要素数を計測しておきその後の処理でOutOfMemoryExceptionが理論上発生しない状態を作ってから処理する。 例えはList.Addは追加すべき要素数がわかっているならできるだけCapacityを増やすのに成功したら処理する。 内部で例外オブジェクトを送信するなら例外オブジェクトはあらかじめnewで作っておくなど。 INSERTの索引の追加時に重複エラーがあった場合例外はthrowせずにグローバル変数にエラーが有ったという情報のみを格納して重複追加する。 INSERT処理が終わったらそのフラグを見て重複エラーがあれば追加した行を全て削除して解放する。 重複エラーがない率が高ければ高速。 プログラム側でthrow new ...Exceptionする場合、このExceptionオブジェクト自体がOutOfMemoryすることがある。 それを考慮して例外を補足するが例外オブジェクトはあらかじめnewしておき使いまわすのもよい。 UPDATE連鎖,DELETE連鎖のための準備データは現在セーフコードを使っているためOutOfMemoryExceptionが発生する。成功すれば既に確保したアンセーフコードに対してのみ操作するから最後まで成功するはず。 しかしこれも処理高速化、例外の可能性を消すためにアンセーフコードにする。 UPDATE連鎖はアンセーフコード、マネージドメモリ共に途中でOutOfMemoryExceptionが発生する。
https://w.atwiki.jp/apilib/pages/2.html
メニュー トップページ プラグイン紹介 まとめサイト作成支援ツール メニュー メニュー2 C/C++ WIN32API Boost TR1 リンク @wiki @wikiご利用ガイド ここを編集
https://w.atwiki.jp/atachi/pages/16.html
2つのカテゴリ [#s3642dbd] SystemException [#s0773bb3] WPFでの未処理の例外 LINQでの例外処理 try-catch-finallyによって投げられた例外を受け取り処理することができます。 try{ // ... 例外を発生させるような処理 var datas = new object[10]; var obj = datas[11]; // IndexOutOfRangeException 例外がスロー }catch(IndexOutOfRangeException e){ // 例外を対処するためのコード }catch(Exception e){ // 例外を対処するためのコード }finally{ // finallyブロックは、 // 例外が発生しなかった場合でも呼び出される。 } IndexOutOfRangeExceptionクラスはExceptionクラスをサブクラスに持つため、上記のように例外構文を記述した場合、両方の例外ブロックにマッチしますが、実行されるのは最初にマッチした例外ブロックのみです。 2つのカテゴリ [#s3642dbd] SystemException システムで使用される例外。ライブラリ間で共通されるべき例外。~ また、SystemExceptionをスーパークラスとして新たなシステム例外は作成してはいけません。 ApplicationException アプリケーション固有の例外。開発者はこの例外を外部にスローしないように気をつける。~ ライブラリ開発でやむを得ず独自の例外が必要となった場合は、発生理由や例外の回避方法、復旧方法をできるだけ詳しいドキュメントで公開しておくべき。 SystemException [#s0773bb3] 通常のプログラム開発に於いて、開発者が利用するであろうシステム例外は下記の通りです。 ArgumentException メソッドに渡された引数が無効である場合にスローする。ただし、nullである場合を除く。 ArgumentNullException メソッドに渡された引数に、nullが含まれている場合にスローする。 IndexOutOfRangeException 配列やプロパティで連続したデータの範囲外にアクセス使用とした場合にスローする。 NotImplementedException 実装されていないメソッドである場合にスローする。 NotImplementedException例外は、開発者が本来実装しなければならない実装を、一時的に後回しにしてしまう場合に、「まだ実装してないことをマークし、例外として警告する」ために使用します。 interface IDataAccess { bool SaveEntity(Person data); } public class BackendDataAccess IDataAccess { public bool SaveEntity(Person data) { // TODO 開発チーム「佐藤くん」が実装予定のメソッドなので、 // 今のところは未実装状態にしておきます。 throw new NotImplementedException(); } } } WPFでの未処理の例外 未処理の例外があった場合、Application.DispatcherUnhandledExceptionイベントが呼び出される。 Handledプロパティを設定しないと、永久にDispatcherUnhandledExceptionイベントが呼び出してしまう例外もあるので注意。 private void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { e.Handled = true; // 例外を処理したことを通知 Shutdown(); // アプリケーションを終了 } LINQでの例外処理 LINQも例外を投げます。~ ただし、LINQは遅延実行を行うため、LINQを定義した場所に例外構文を記述するのではなくLINQを実行する箇所で例外をキャッチしなければなりません。 var b = from p in MyLists select p; foreach(Data obj in b){ Console.WriteLine(obj); } このように定義したLINQが実行時に発生する例外のキャッチには、次のようにforeachステートメントの部分で行います。 try{ foreach(Data obj in b) { Console.WriteLine(obj); } }catch(Exception e){ }
https://w.atwiki.jp/abwiki/pages/518.html
CDを認識してデーターを書き込んだり読み出したりする装置。 ABではWin32APIを通してアクセスする。 AKRIP というライブラリもある。
https://w.atwiki.jp/netnet/pages/21.html
開発などに関連する便利なウェブページへのリンク集です。 ■オープンソース CodeProject さまざまなオープンソースプロジェクトと記事があります。(English) CodePlex Microsoftが管理するオープンソースサイト。(English) SourceForge さまざまなオープンソースプロジェクトがあります。(English) ■Win32APi PInvoke WIN32APIを使用する場合には、こちらがおすすめ。(English) ■サンプルコード・Tips DOBON.netプログラミング道 Tipsが豊富です。 宇宙仮面のC#プログラミング サンプルコードが豊富です。 緑のバイク Tipsが豊富です。 C#とVB.netの入門サイト Tipsが豊富です。